这是一道模拟题……
那么我为什么要写它的题解呢?其实最初只是想给我们同机房的大佬证明一下这题没那么难QwQ,然后调了几乎一个半小时调过了。(然后就闲着无聊来写一发了)
那么虽然是模拟,直接去写的话肯定会炸(不要问我是怎么知道的,我在考场上就是直接去写然后炸掉了)。主流的做法有两种:堆栈和递归。
那么我在这里介绍的是堆栈。怎么堆呢?其实基本的思路就是莽着堆,每一层循环都有一个变量,所以我堆了一个栈存变量,又堆了一个栈存循环本身(也就是用复杂度代表的)1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
using namespace std;
int t,n,cnt,top,top1,stk[N],cpx[N];
char ch[15],s[120][15],st[N];
bool flag[N],f;
inline int geto()
{
    if(ch[2]=='1')
        return 0;
    int i=4,x=0;
    while(ch[i]>='0'&&ch[i]<='9')
        x=x*10+ch[i]-'0',i++;
    return x;
}
inline void getnum(int k,int &down,int &up)
{
    int i=4;
    while(s[k][i]>='0'&&s[k][i]<='9')
        down=down*10+s[k][i]-'0',i++;
    i++;
    while(s[k][i]>='0'&&s[k][i]<='9')
        up=up*10+s[k][i]-'0',i++;
}
int main()
{
    scanf("%d",&t);
    while(t--)
    {
        memset(ch,0,sizeof(ch));
        memset(s,0,sizeof(s));
        memset(cpx,0,sizeof(cpx));
        memset(flag,0,sizeof(flag));
        top=top1=0;
        cnt=f=0;
        scanf("%d",&n);
        getchar();
        gets(ch);
        int ent=geto();
        for(register int i=1;i<=n;i++)
        {
            gets(s[i]);
            if(f)
                continue;
            if(s[i][0]=='F')
            {
                if(flag[s[i][2]])
                    f=1;
                st[++top]=s[i][2];
                flag[st[top]]=1;
                int up=0,down=0;
                getnum(i,down,up);
                if(s[i][strlen(s[i])-1]=='n'&&s[i][4]!='n')
                    cpx[++cnt]=stk[++top1]=stk[top1-1]+1;
                else if((s[i][4]=='n'&&s[i][strlen(s[i])-1]!='n')||(down&&up&&down>up))
                    cpx[++cnt]=stk[++top1]=-inf;
                else
                    cpx[++cnt]=stk[++top1]=stk[top1-1];
            }
            else
            {
                if(top==0)
                    f=1;
                else
                {
                    flag[st[top--]]=0;
                    top1--;
                }
            }
        }
        if(top)
            f=1;
        int ans=0;
        for(register int i=1;i<=cnt;i++)
            ans=max(ans,cpx[i]);
        if(f)
            printf("ERR\n");
        else if(ans==ent)
            printf("Yes\n");
        else
            printf("No\n");
    }
    return 0;
}